{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 0. Import Libraries"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%pip install pandas\n",
    "%pip install matplotlib"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import tensorflow as tf\n",
    "import tensorflow.keras as keras\n",
    "from tensorflow.keras import backend as K\n",
    "from tensorflow.keras.layers import *\n",
    "\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "from scipy.io import loadmat\n",
    "from scipy.io import savemat\n",
    "import math\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.pyplot as plt\n",
    "from matplotlib import cm\n",
    "from matplotlib.ticker import LinearLocator\n",
    "\n",
    "import time"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "from numpy.random import seed\n",
    "seed(0)\n",
    "tf.random.set_seed(0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1. Define bird-like domain\n",
    "rho_theta :bird-like domain ; U(x,y) :exact solution"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "def rho_theta(theta):\n",
    "    return np.exp(np.sin(theta))*np.sin(3*theta)**2+np.exp(np.cos(theta))*np.cos(3*theta)**2\n",
    "    \n",
    "def rho_xy(x,y):\n",
    "    return rho_theta(np.angle(x+y*1j))\n",
    "\n",
    "def x_theta(theta):\n",
    "    return rho_theta(theta)*np.cos(theta)\n",
    "\n",
    "def y_theta(theta):\n",
    "    return rho_theta(theta)*np.sin(theta)\n",
    "\n",
    "def R(x,y):\n",
    "    return np.sqrt(x**2+y**2)\n",
    "\n",
    "def U(x,y):\n",
    "    return np.cos(k*x*y+k*y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2. Initialize the Grid"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "delta = 0.02\n",
    "x_domain = np.arange(-2, 3, delta)\n",
    "y_domain = np.arange(-2, 3, delta)\n",
    "x_mesh,y_mesh = np.meshgrid(x_domain, y_domain)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3. Define Physical Info."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "    suppose: \n",
    "    x = x[0];\n",
    "    y = x[1];\n",
    "    uxy = x[2]; \n",
    "    dudx = x[3];\n",
    "    dudy = x[4];\n",
    "    du2dx2 = x[5];\n",
    "    du2dy2 = x[6];\n",
    "    du2dxdy = x[7];\n",
    "    laplace = x[8]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "k=5\n",
    "governing_equation_components = []\n",
    "governing_equation_components.append(Lambda(lambda x: x[8]))\n",
    "governing_equation_components.append(Lambda(lambda x: tf.sin(x[2]**2)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "governing_equation_mask = R(x_mesh,y_mesh)<=rho_xy(x_mesh,y_mesh)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#fx = governing_equation_mask*(4*np.exp(-x_mesh-y_mesh)-(k+k*x_mesh)**2*np.cos(x_mesh+k*y_mesh+k*x_mesh*y_mesh)-(k+k*y_mesh)**2*np.cos(x_mesh+k*y_mesh+k*x_mesh*y_mesh))\n",
    "fx=x_mesh*0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "fx = governing_equation_mask*(\n",
    "    -np.cos(k*y_mesh+k*x_mesh*y_mesh)*(k+k*x_mesh)**2-k**2*y_mesh**2*np.cos(k*y_mesh+k*x_mesh*y_mesh)\n",
    "    +np.sin(np.cos(k*y_mesh+k*x_mesh*y_mesh)**2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "estimate_equation_form = False\n",
    "equation_component_combination = [1.0,1.0]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4. Define the Observations"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "    suppose: \n",
    "    x = x[0];\n",
    "    y = x[1];\n",
    "    uxy = x[2]; \n",
    "    dudx = x[3];\n",
    "    dudy = x[4];\n",
    "    du2dx2 = x[5];\n",
    "    du2dy2 = x[6];\n",
    "    du2dxdy = x[7];\n",
    "    laplace = x[8]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "observation_components = []\n",
    "observation_components.append(Lambda(lambda x: x[2]))\n",
    "observation_components.append(Lambda(lambda x: x[3]))\n",
    "observation_components.append(Lambda(lambda x: x[4]))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "    format: [x,y,combination,value]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Boundary Condition"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "observation_data = []\n",
    "\n",
    "theta_list = np.linspace(0,np.pi*2,800)\n",
    "for theta in theta_list:\n",
    "    x = x_theta(theta)\n",
    "    y = y_theta(theta)\n",
    "    comb = [1,0,0]\n",
    "    v = U(x,y)\n",
    "    observation_data.append([x,y,comb,v])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 5. Define PICN"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "def gradient_x_kernal_init(shape, dtype=tf.float32):\n",
    "    return tf.constant([[[[-1.0/delta]], [[1.0/delta]]]], dtype=dtype)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "def gradient_x2_kernal_init(shape, dtype=tf.float32):\n",
    "    return tf.constant([[[[1.0/delta**2]], [[-2.0/delta**2]], [[1.0/delta**2]]]], dtype=dtype)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "def gradient_y_kernal_init(shape, dtype=tf.float32):\n",
    "    return tf.constant([[[[-1.0/delta]]], [[[1.0/delta]]]], dtype=dtype)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "def gradient_y2_kernal_init(shape, dtype=tf.float32):\n",
    "    return tf.constant([[[[1.0/delta**2]]], [[[-2.0/delta**2]]], [[[1.0/delta**2]]]], dtype=dtype)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "def gradient_xy_kernal_init(shape, dtype=tf.float32):\n",
    "    return tf.constant([[[[1.0/delta**2]], [[-1.0/delta**2]]], [[[-1.0/delta**2]], [[1.0/delta**2]]]], dtype=dtype)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "def laplace_kernal_init(shape, dtype=tf.float32):\n",
    "    return tf.constant([[[[0]], [[1.0/delta**2]], [[0]]], [[[1.0/delta**2]], [[-4.0/delta**2]], [[1.0/delta**2]]], [[[0]], [[1.0/delta**2]], [[0]]]], dtype=dtype)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "inputs = [keras.layers.Input(shape=(1,1,1)),\n",
    "          keras.layers.Input(shape=(len(y_domain),len(x_domain),1)),\n",
    "          keras.layers.Input(shape=(len(y_domain),len(x_domain),1)),\n",
    "          keras.layers.Input(shape=(len(observation_data),len(observation_components)*4)),\n",
    "          keras.layers.Input(shape=(len(y_domain),len(x_domain),1))]\n",
    "\n",
    "hidden_field = keras.layers.Conv2DTranspose(filters=1, \n",
    "                                            kernel_size=[len(y_domain)+4,len(x_domain)+4], \n",
    "                                            activation='linear')(inputs[0])\n",
    "coordinates_x = inputs[1]\n",
    "coordinates_y = inputs[2]\n",
    "field = keras.layers.Conv2D(filters=1, \n",
    "                            kernel_size=3, \n",
    "                            padding='valid', \n",
    "                            activation=Lambda(lambda x: x+tf.tanh(x)))(hidden_field)\n",
    "gradient_x_field = keras.layers.Conv2D(filters=1, \n",
    "                                     kernel_size=[1,2], \n",
    "                                     padding='valid',\n",
    "                                     use_bias=False,\n",
    "                                     trainable=False,\n",
    "                                     kernel_initializer=gradient_x_kernal_init)(field)\n",
    "gradient_x2_field = keras.layers.Conv2D(filters=1, \n",
    "                                       kernel_size=[1,3], \n",
    "                                       padding='valid',\n",
    "                                       use_bias=False,\n",
    "                                       trainable=False,\n",
    "                                       kernel_initializer=gradient_x2_kernal_init)(field)\n",
    "gradient_y_field = keras.layers.Conv2D(filters=1, \n",
    "                                     kernel_size=[2,1], \n",
    "                                     padding='valid',\n",
    "                                     use_bias=False,\n",
    "                                     trainable=False,\n",
    "                                     kernel_initializer=gradient_y_kernal_init)(field)\n",
    "gradient_y2_field = keras.layers.Conv2D(filters=1, \n",
    "                                       kernel_size=[3,1], \n",
    "                                       padding='valid',\n",
    "                                       use_bias=False,\n",
    "                                       trainable=False,\n",
    "                                       kernel_initializer=gradient_y2_kernal_init)(field)\n",
    "gradient_xy_field = keras.layers.Conv2D(filters=1, \n",
    "                                       kernel_size=[2,2], \n",
    "                                       padding='valid',\n",
    "                                       use_bias=False,\n",
    "                                       trainable=False,\n",
    "                                       kernel_initializer=gradient_xy_kernal_init)(field)\n",
    "laplace_field = keras.layers.Conv2D(filters=1, \n",
    "                                       kernel_size=[3,3], \n",
    "                                       padding='valid',\n",
    "                                       use_bias=False,\n",
    "                                       trainable=False,\n",
    "                                       kernel_initializer=laplace_kernal_init)(field)\n",
    "phycial_fields = [coordinates_x,\n",
    "                  coordinates_y,\n",
    "                  field[:,1:-1,1:-1,:],\n",
    "                  gradient_x_field[:,1:-1,1:,:],\n",
    "                  gradient_y_field[:,1:,1:-1,:],\n",
    "                  gradient_x2_field[:,1:-1,:,:],\n",
    "                  gradient_y2_field[:,:,1:-1,:],\n",
    "                  gradient_xy_field[:,1:,1:,:],\n",
    "                  laplace_field]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "if estimate_equation_form==True:\n",
    "    tf_governing_equation_components = [component(phycial_fields) for component in governing_equation_components]\n",
    "    concat_equation_components = Lambda(lambda x: tf.concat(x,axis=-1))(tf_governing_equation_components)\n",
    "    governing_equation = keras.layers.Conv2D(filters=1, \n",
    "                                             kernel_size=[1,1], \n",
    "                                             padding='valid',\n",
    "                                             use_bias=False)(concat_equation_components)*inputs[4]\n",
    "else:\n",
    "    tf_weighted_governing_equation_components = [weight*component(phycial_fields) for [weight,component] in zip(equation_component_combination,governing_equation_components)]\n",
    "    concat_weighted_equation_components = Lambda(lambda x: tf.concat(x,axis=-1))(tf_weighted_governing_equation_components)\n",
    "    governing_equation = Lambda(lambda x: tf.reduce_sum(x,axis=-1,keepdims=True))(concat_weighted_equation_components)*inputs[4]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "tf_observation_components = [component(phycial_fields) for component in observation_components]\n",
    "concat_observation_components = Lambda(lambda x: tf.concat(x,axis=-1))(tf_observation_components)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "left_x_position_index_list = []\n",
    "right_x_position_index_list = []\n",
    "left_x_position_weight_list = []\n",
    "right_x_position_weight_list = []\n",
    "\n",
    "bottom_y_position_index_list = []\n",
    "top_y_position_index_list = []\n",
    "bottom_y_position_weight_list = []\n",
    "top_y_position_weight_list = []\n",
    "\n",
    "\n",
    "for data in observation_data:\n",
    "    \n",
    "    left_x_position_index = int(np.floor((data[0] - x_domain[0])/delta))\n",
    "    right_x_position_index = left_x_position_index + 1\n",
    "    left_x_position_weight = 1-(data[0] - (x_domain[0]+delta*left_x_position_index))/delta\n",
    "    right_x_position_weight = 1-left_x_position_weight\n",
    "    \n",
    "    bottom_y_position_index = int(np.floor((data[1] - y_domain[0])/delta))\n",
    "    top_y_position_index = bottom_y_position_index + 1\n",
    "    bottom_y_position_weight = 1-(data[1] - (y_domain[0]+delta*bottom_y_position_index))/delta\n",
    "    top_y_position_weight = 1-bottom_y_position_weight\n",
    "    \n",
    "    if data[0] <= x_domain[0] + 1e-8:\n",
    "        left_x_position_index = 0\n",
    "        right_x_position_index = 1\n",
    "        left_x_position_weight = 1\n",
    "        right_x_position_weight = 0\n",
    "    if data[0] >= x_domain[-1] - 1e-8:\n",
    "        left_x_position_index = len(x_domain)-2\n",
    "        right_x_position_index = len(x_domain)-1\n",
    "        left_x_position_weight = 0\n",
    "        right_x_position_weight = 1\n",
    "    if data[1] <= y_domain[0] + 1e-8:\n",
    "        bottom_y_position_index = 0\n",
    "        top_y_position_index = 1\n",
    "        bottom_y_position_weight = 1\n",
    "        top_y_position_weight = 0\n",
    "    if data[1] >= y_domain[-1] - 1e-8:\n",
    "        bottom_y_position_index = len(y_domain)-2\n",
    "        top_y_position_index = len(y_domain)-1\n",
    "        bottom_y_position_weight = 0\n",
    "        top_y_position_weight = 1\n",
    "    \n",
    "    left_x_position_index_list.append(left_x_position_index)\n",
    "    right_x_position_index_list.append(right_x_position_index)\n",
    "    left_x_position_weight_list.append(left_x_position_weight)\n",
    "    right_x_position_weight_list.append(right_x_position_weight)\n",
    "\n",
    "    bottom_y_position_index_list.append(bottom_y_position_index)\n",
    "    top_y_position_index_list.append(top_y_position_index)\n",
    "    bottom_y_position_weight_list.append(bottom_y_position_weight)\n",
    "    top_y_position_weight_list.append(top_y_position_weight)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "left_bottom_indices = tf.constant([[0,y,x] for x,y in zip(left_x_position_index_list,bottom_y_position_index_list)])\n",
    "left_top_indices = tf.constant([[0,y,x] for x,y in zip(left_x_position_index_list,top_y_position_index_list)])\n",
    "right_bottom_indices = tf.constant([[0,y,x] for x,y in zip(right_x_position_index_list,bottom_y_position_index_list)])\n",
    "right_top_indices = tf.constant([[0,y,x] for x,y in zip(right_x_position_index_list,top_y_position_index_list)])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "observation_data_left_bottom_part = Lambda(lambda x: tf.gather_nd(x,left_bottom_indices))(concat_observation_components)\n",
    "observation_data_left_top_part = Lambda(lambda x: tf.gather_nd(x,left_top_indices))(concat_observation_components)\n",
    "observation_data_right_bottom_part = Lambda(lambda x: tf.gather_nd(x,right_bottom_indices))(concat_observation_components)\n",
    "observation_data_right_top_part = Lambda(lambda x: tf.gather_nd(x,right_top_indices))(concat_observation_components)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "observation_data_four_part = Lambda(lambda x: tf.expand_dims(tf.concat(x,axis=-1),axis=0))([observation_data_left_bottom_part,observation_data_left_top_part,observation_data_right_bottom_part,observation_data_right_top_part])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "observation_data_interpolation_weights = np.expand_dims(\n",
    "np.asarray([np.concatenate([(np.asarray([observation_data[i][2][j] for j in range(len(observation_components))]))*left_x_position_weight_list[i]*bottom_y_position_weight_list[i],\n",
    " (np.asarray([observation_data[i][2][j] for j in range(len(observation_components))]))*left_x_position_weight_list[i]*top_y_position_weight_list[i],\n",
    " (np.asarray([observation_data[i][2][j] for j in range(len(observation_components))]))*right_x_position_weight_list[i]*bottom_y_position_weight_list[i],\n",
    " (np.asarray([observation_data[i][2][j] for j in range(len(observation_components))]))*right_x_position_weight_list[i]*top_y_position_weight_list[i]],axis=-1) for i in range(len(observation_data))]),\n",
    "    axis=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [],
   "source": [
    "observations = Lambda(lambda x: tf.reduce_sum(x[0]*x[1],axis=-1))([inputs[3][0,:,:],observation_data_four_part])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 6. Model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "pde_model = keras.Model(inputs=inputs[:3], outputs=phycial_fields)\n",
    "pde_model_train = keras.Model(inputs=inputs, outputs=[governing_equation,observations])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"model\"\n",
      "__________________________________________________________________________________________________\n",
      " Layer (type)                Output Shape                 Param #   Connected to                  \n",
      "==================================================================================================\n",
      " input_1 (InputLayer)        [(None, 1, 1, 1)]            0         []                            \n",
      "                                                                                                  \n",
      " conv2d_transpose (Conv2DTr  (None, 254, 254, 1)          64517     ['input_1[0][0]']             \n",
      " anspose)                                                                                         \n",
      "                                                                                                  \n",
      " conv2d (Conv2D)             (None, 252, 252, 1)          10        ['conv2d_transpose[0][0]']    \n",
      "                                                                                                  \n",
      " conv2d_1 (Conv2D)           (None, 252, 251, 1)          2         ['conv2d[0][0]']              \n",
      "                                                                                                  \n",
      " conv2d_3 (Conv2D)           (None, 251, 252, 1)          2         ['conv2d[0][0]']              \n",
      "                                                                                                  \n",
      " conv2d_2 (Conv2D)           (None, 252, 250, 1)          3         ['conv2d[0][0]']              \n",
      "                                                                                                  \n",
      " conv2d_4 (Conv2D)           (None, 250, 252, 1)          3         ['conv2d[0][0]']              \n",
      "                                                                                                  \n",
      " conv2d_5 (Conv2D)           (None, 251, 251, 1)          4         ['conv2d[0][0]']              \n",
      "                                                                                                  \n",
      " input_2 (InputLayer)        [(None, 250, 250, 1)]        0         []                            \n",
      "                                                                                                  \n",
      " input_3 (InputLayer)        [(None, 250, 250, 1)]        0         []                            \n",
      "                                                                                                  \n",
      " tf.__operators__.getitem (  (None, 250, 250, 1)          0         ['conv2d[0][0]']              \n",
      " SlicingOpLambda)                                                                                 \n",
      "                                                                                                  \n",
      " tf.__operators__.getitem_1  (None, 250, 250, 1)          0         ['conv2d_1[0][0]']            \n",
      "  (SlicingOpLambda)                                                                               \n",
      "                                                                                                  \n",
      " tf.__operators__.getitem_2  (None, 250, 250, 1)          0         ['conv2d_3[0][0]']            \n",
      "  (SlicingOpLambda)                                                                               \n",
      "                                                                                                  \n",
      " tf.__operators__.getitem_3  (None, 250, 250, 1)          0         ['conv2d_2[0][0]']            \n",
      "  (SlicingOpLambda)                                                                               \n",
      "                                                                                                  \n",
      " tf.__operators__.getitem_4  (None, 250, 250, 1)          0         ['conv2d_4[0][0]']            \n",
      "  (SlicingOpLambda)                                                                               \n",
      "                                                                                                  \n",
      " tf.__operators__.getitem_5  (None, 250, 250, 1)          0         ['conv2d_5[0][0]']            \n",
      "  (SlicingOpLambda)                                                                               \n",
      "                                                                                                  \n",
      " conv2d_6 (Conv2D)           (None, 250, 250, 1)          9         ['conv2d[0][0]']              \n",
      "                                                                                                  \n",
      "==================================================================================================\n",
      "Total params: 64550 (252.15 KB)\n",
      "Trainable params: 64527 (252.06 KB)\n",
      "Non-trainable params: 23 (92.00 Byte)\n",
      "__________________________________________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "def model_print_functoin(s):\n",
    "    with open('model_summary.txt','a') as f:\n",
    "        print(s, file=f)\n",
    "\n",
    "pde_model.summary(print_fn=model_print_functoin)\n",
    "pde_model.summary()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 7. Prepare the Training Data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(1, 1, 1, 1)\n"
     ]
    }
   ],
   "source": [
    "unit_constant = np.asarray([[[[1.0]]]],dtype=np.float32)\n",
    "training_input_data_0 = unit_constant\n",
    "print(training_input_data_0.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(1, 250, 250, 1)\n"
     ]
    }
   ],
   "source": [
    "training_input_data_1 = np.expand_dims(x_mesh.astype(np.float32),axis=[0,-1])\n",
    "print(training_input_data_1.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(1, 250, 250, 1)\n"
     ]
    }
   ],
   "source": [
    "training_input_data_2 = np.expand_dims(y_mesh.astype(np.float32),axis=[0,-1])\n",
    "print(training_input_data_2.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(1, 800, 12)\n"
     ]
    }
   ],
   "source": [
    "training_input_data_3 = observation_data_interpolation_weights.astype(np.float32)\n",
    "print(training_input_data_3.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(1, 250, 250, 1)\n"
     ]
    }
   ],
   "source": [
    "training_input_data_4 = np.expand_dims(governing_equation_mask.astype(np.float32),axis=[0,-1])\n",
    "print(training_input_data_2.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(1, 250, 250, 1)\n"
     ]
    }
   ],
   "source": [
    "training_label_data_0 = np.expand_dims(fx.astype(np.float32),axis=[0,-1])\n",
    "print(training_label_data_0.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(1, 800)\n"
     ]
    }
   ],
   "source": [
    "training_label_data_1 = np.expand_dims(np.asarray([data[3] for data in observation_data]),axis=[0])\n",
    "print(training_label_data_1.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [],
   "source": [
    "training_input_data = [training_input_data_0,training_input_data_1,training_input_data_2,training_input_data_3,training_input_data_4]\n",
    "training_label_data = [training_label_data_0,training_label_data_1]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 8. Train the Model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['loss', 'tf.math.multiply_2_loss', 'lambda_14_loss']\n"
     ]
    }
   ],
   "source": [
    "pde_model_train.compile(optimizer=keras.optimizers.Adam(), loss=\"mse\")\n",
    "pde_model_train.save_weights('picn_initial_weights.h5')\n",
    "temp_history = pde_model_train.fit(x=training_input_data, y=training_label_data, epochs=1, verbose=0)\n",
    "history_keys = []\n",
    "for key in temp_history.history.keys():\n",
    "    history_keys.append(key)\n",
    "print(history_keys)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [],
   "source": [
    "def record_predictions():\n",
    "    [_, _, uxy, dudx, dudy, d2udx2, d2udy2, d2udxdy, laplace] = pde_model.predict(training_input_data[:3])\n",
    "    uxy_list.append(uxy[:,:,:,0])\n",
    "    dudx_list.append(dudx[:,:,:,0])\n",
    "    dudy_list.append(dudy[:,:,:,0])\n",
    "    d2udx2_list.append(d2udx2[:,:,:,0])\n",
    "    d2udy2_list.append(d2udy2[:,:,:,0])\n",
    "    d2udxdy_list.append(d2udxdy[:,:,:,0])\n",
    "    laplace_list.append(laplace[:,:,:,0])\n",
    "\n",
    "class Per_X_Epoch_Record(tf.keras.callbacks.Callback):\n",
    "    def __init__(self, record_interval, verbose=1):\n",
    "        super(tf.keras.callbacks.Callback, self).__init__()\n",
    "        self.total_loss = history_keys[0]\n",
    "        self.domain_loss = history_keys[1]\n",
    "        self.bdc_loss = history_keys[2]\n",
    "        self.previous_total_loss = 9999999\n",
    "        self.record_interval = record_interval\n",
    "        self.verbose = verbose\n",
    "\n",
    "    def on_epoch_end(self, epoch, logs={}):\n",
    "        \n",
    "        if epoch%self.record_interval == 0:\n",
    "            \n",
    "            current_total_loss = logs.get(self.total_loss)\n",
    "            current_domain_loss = logs.get(self.domain_loss)\n",
    "            current_bdc_loss = logs.get(self.bdc_loss)\n",
    "            \n",
    "            epoch_number_list.append(epoch)\n",
    "            total_loss_list.append(current_total_loss)\n",
    "            domain_loss_list.append(current_domain_loss)\n",
    "            boundary_loss_list.append(current_bdc_loss)\n",
    "        \n",
    "            if current_total_loss < self.previous_total_loss:\n",
    "                self.previous_total_loss = current_total_loss\n",
    "                pde_model_train.save_weights('picn_best_weights.h5')\n",
    "            \n",
    "            if self.verbose > 0:\n",
    "                print(\"epoch: {:10.5f} | total_loss: {:10.5f} | domain_loss: {:10.5f} | bdc_loss: {:10.5f}\".format(epoch,current_total_loss,current_domain_loss,current_bdc_loss))\n",
    "        \n",
    "            # evaluate the errors in f-domain\n",
    "            record_predictions()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [],
   "source": [
    "callbacks = [\n",
    "    Per_X_Epoch_Record(record_interval=200,verbose=1),\n",
    "]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch:    0.00000 | total_loss:   35.25377 | domain_loss: 3475.48364 | bdc_loss:    0.50397\n",
      "1/1 [==============================] - 0s 63ms/step\n",
      "epoch:  200.00000 | total_loss:   20.42955 | domain_loss: 1993.05139 | bdc_loss:    0.50408\n",
      "1/1 [==============================] - 0s 11ms/step\n",
      "epoch:  400.00000 | total_loss:   19.81922 | domain_loss: 1931.58020 | bdc_loss:    0.50850\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch:  600.00000 | total_loss:   19.35318 | domain_loss: 1884.31165 | bdc_loss:    0.51521\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch:  800.00000 | total_loss:   18.92377 | domain_loss: 1840.56189 | bdc_loss:    0.52338\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 1000.00000 | total_loss:   18.47827 | domain_loss: 1795.08765 | bdc_loss:    0.53272\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 1200.00000 | total_loss:   17.95890 | domain_loss: 1742.09900 | bdc_loss:    0.54334\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 1400.00000 | total_loss:   17.25977 | domain_loss: 1670.96826 | bdc_loss:    0.55565\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 1600.00000 | total_loss:   16.18876 | domain_loss: 1562.38977 | bdc_loss:    0.57056\n",
      "1/1 [==============================] - 0s 14ms/step\n",
      "epoch: 1800.00000 | total_loss:   14.54748 | domain_loss: 1396.44751 | bdc_loss:    0.58889\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 2000.00000 | total_loss:   12.39264 | domain_loss: 1178.95410 | bdc_loss:    0.60919\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 2200.00000 | total_loss:   10.07697 | domain_loss:  945.62866 | bdc_loss:    0.62695\n",
      "1/1 [==============================] - 0s 11ms/step\n",
      "epoch: 2400.00000 | total_loss:    7.94612 | domain_loss:  731.48047 | bdc_loss:    0.63769\n",
      "1/1 [==============================] - 0s 13ms/step\n",
      "epoch: 2600.00000 | total_loss:    6.14862 | domain_loss:  551.58636 | bdc_loss:    0.63915\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 2800.00000 | total_loss:    4.71586 | domain_loss:  409.13248 | bdc_loss:    0.63084\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 3000.00000 | total_loss:    3.62276 | domain_loss:  301.52939 | bdc_loss:    0.61360\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 3200.00000 | total_loss:    2.80074 | domain_loss:  221.81169 | bdc_loss:    0.58851\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 3400.00000 | total_loss:    2.18478 | domain_loss:  163.35303 | bdc_loss:    0.55682\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 3600.00000 | total_loss:    1.71851 | domain_loss:  120.36890 | bdc_loss:    0.52002\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 3800.00000 | total_loss:    1.36403 | domain_loss:   88.92278 | bdc_loss:    0.47959\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 4000.00000 | total_loss:    1.09282 | domain_loss:   66.00907 | bdc_loss:    0.43710\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 4200.00000 | total_loss:    0.88237 | domain_loss:   49.21834 | bdc_loss:    0.39413\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 4400.00000 | total_loss:    0.71692 | domain_loss:   36.84652 | bdc_loss:    0.35198\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 4600.00000 | total_loss:    0.58537 | domain_loss:   27.68890 | bdc_loss:    0.31160\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 4800.00000 | total_loss:    0.47963 | domain_loss:   20.87446 | bdc_loss:    0.27363\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 5000.00000 | total_loss:    0.39378 | domain_loss:   15.77114 | bdc_loss:    0.23845\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 5200.00000 | total_loss:    0.32344 | domain_loss:   11.92448 | bdc_loss:    0.20626\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 5400.00000 | total_loss:    0.26547 | domain_loss:    9.01240 | bdc_loss:    0.17712\n",
      "1/1 [==============================] - 0s 13ms/step\n",
      "epoch: 5600.00000 | total_loss:    0.21755 | domain_loss:    6.80744 | bdc_loss:    0.15098\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 5800.00000 | total_loss:    0.17792 | domain_loss:    5.14473 | bdc_loss:    0.12775\n",
      "1/1 [==============================] - 0s 11ms/step\n",
      "epoch: 6000.00000 | total_loss:    0.14521 | domain_loss:    3.89972 | bdc_loss:    0.10729\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 6200.00000 | total_loss:    0.11827 | domain_loss:    2.97386 | bdc_loss:    0.08943\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 6400.00000 | total_loss:    0.09615 | domain_loss:    2.28806 | bdc_loss:    0.07401\n",
      "1/1 [==============================] - 0s 13ms/step\n",
      "epoch: 6600.00000 | total_loss:    0.07803 | domain_loss:    1.78009 | bdc_loss:    0.06084\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 6800.00000 | total_loss:    0.06324 | domain_loss:    1.40136 | bdc_loss:    0.04973\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 7000.00000 | total_loss:    0.05120 | domain_loss:    1.11571 | bdc_loss:    0.04045\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 7200.00000 | total_loss:    0.04144 | domain_loss:    0.89770 | bdc_loss:    0.03279\n",
      "1/1 [==============================] - 0s 11ms/step\n",
      "epoch: 7400.00000 | total_loss:    0.03356 | domain_loss:    0.72911 | bdc_loss:    0.02653\n",
      "1/1 [==============================] - 0s 13ms/step\n",
      "epoch: 7600.00000 | total_loss:    0.02719 | domain_loss:    0.59698 | bdc_loss:    0.02144\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 7800.00000 | total_loss:    0.02206 | domain_loss:    0.49185 | bdc_loss:    0.01731\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 8000.00000 | total_loss:    0.01790 | domain_loss:    0.40707 | bdc_loss:    0.01397\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 8200.00000 | total_loss:    0.01456 | domain_loss:    0.34000 | bdc_loss:    0.01127\n",
      "1/1 [==============================] - 0s 13ms/step\n",
      "epoch: 8400.00000 | total_loss:    0.01184 | domain_loss:    0.28481 | bdc_loss:    0.00908\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 8600.00000 | total_loss:    0.00963 | domain_loss:    0.23957 | bdc_loss:    0.00731\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 8800.00000 | total_loss:    0.00784 | domain_loss:    0.20296 | bdc_loss:    0.00587\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 9000.00000 | total_loss:    0.00638 | domain_loss:    0.17267 | bdc_loss:    0.00470\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 9200.00000 | total_loss:    0.00521 | domain_loss:    0.14827 | bdc_loss:    0.00376\n",
      "1/1 [==============================] - 0s 11ms/step\n",
      "epoch: 9400.00000 | total_loss:    0.00426 | domain_loss:    0.12803 | bdc_loss:    0.00301\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 9600.00000 | total_loss:    0.00348 | domain_loss:    0.10966 | bdc_loss:    0.00241\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 9800.00000 | total_loss:    0.00288 | domain_loss:    0.09699 | bdc_loss:    0.00193\n",
      "1/1 [==============================] - 0s 11ms/step\n",
      "epoch: 10000.00000 | total_loss:    0.00237 | domain_loss:    0.08435 | bdc_loss:    0.00155\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 10200.00000 | total_loss:    0.00197 | domain_loss:    0.07418 | bdc_loss:    0.00125\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 10400.00000 | total_loss:    0.00166 | domain_loss:    0.06656 | bdc_loss:    0.00101\n",
      "1/1 [==============================] - 0s 13ms/step\n",
      "epoch: 10600.00000 | total_loss:    0.00142 | domain_loss:    0.06025 | bdc_loss:    0.00082\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 10800.00000 | total_loss:    0.00121 | domain_loss:    0.05424 | bdc_loss:    0.00068\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 11000.00000 | total_loss:    0.00104 | domain_loss:    0.04920 | bdc_loss:    0.00056\n",
      "1/1 [==============================] - 0s 13ms/step\n",
      "epoch: 11200.00000 | total_loss:    0.00091 | domain_loss:    0.04484 | bdc_loss:    0.00046\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 11400.00000 | total_loss:    0.00081 | domain_loss:    0.04198 | bdc_loss:    0.00039\n",
      "1/1 [==============================] - 0s 11ms/step\n",
      "epoch: 11600.00000 | total_loss:    0.00070 | domain_loss:    0.03748 | bdc_loss:    0.00033\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 11800.00000 | total_loss:    0.00063 | domain_loss:    0.03570 | bdc_loss:    0.00028\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 12000.00000 | total_loss:    0.00057 | domain_loss:    0.03283 | bdc_loss:    0.00024\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 12200.00000 | total_loss:    0.00052 | domain_loss:    0.03157 | bdc_loss:    0.00021\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 12400.00000 | total_loss:    0.00047 | domain_loss:    0.02887 | bdc_loss:    0.00018\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 12600.00000 | total_loss:    0.00044 | domain_loss:    0.02827 | bdc_loss:    0.00016\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 12800.00000 | total_loss:    0.00039 | domain_loss:    0.02526 | bdc_loss:    0.00014\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 13000.00000 | total_loss:    0.00036 | domain_loss:    0.02416 | bdc_loss:    0.00012\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 13200.00000 | total_loss:    0.00034 | domain_loss:    0.02299 | bdc_loss:    0.00011\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 13400.00000 | total_loss:    0.00032 | domain_loss:    0.02241 | bdc_loss:    0.00010\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 13600.00000 | total_loss:    0.00030 | domain_loss:    0.02170 | bdc_loss:    0.00009\n",
      "1/1 [==============================] - 0s 13ms/step\n",
      "epoch: 13800.00000 | total_loss:    0.00027 | domain_loss:    0.01982 | bdc_loss:    0.00008\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 14000.00000 | total_loss:    0.00026 | domain_loss:    0.01902 | bdc_loss:    0.00007\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 14200.00000 | total_loss:    0.00025 | domain_loss:    0.01821 | bdc_loss:    0.00006\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 14400.00000 | total_loss:    0.00024 | domain_loss:    0.01813 | bdc_loss:    0.00006\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 14600.00000 | total_loss:    0.00022 | domain_loss:    0.01679 | bdc_loss:    0.00005\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 14800.00000 | total_loss:    0.00019 | domain_loss:    0.01435 | bdc_loss:    0.00005\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 15000.00000 | total_loss:    0.00021 | domain_loss:    0.01641 | bdc_loss:    0.00005\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 15200.00000 | total_loss:    0.00020 | domain_loss:    0.01615 | bdc_loss:    0.00004\n",
      "1/1 [==============================] - 0s 13ms/step\n",
      "epoch: 15400.00000 | total_loss:    0.00017 | domain_loss:    0.01307 | bdc_loss:    0.00004\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 15600.00000 | total_loss:    0.00017 | domain_loss:    0.01350 | bdc_loss:    0.00004\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 15800.00000 | total_loss:    0.00017 | domain_loss:    0.01348 | bdc_loss:    0.00003\n",
      "1/1 [==============================] - 0s 13ms/step\n",
      "epoch: 16000.00000 | total_loss:    0.00016 | domain_loss:    0.01269 | bdc_loss:    0.00003\n",
      "1/1 [==============================] - 0s 13ms/step\n",
      "epoch: 16200.00000 | total_loss:    0.00015 | domain_loss:    0.01195 | bdc_loss:    0.00003\n",
      "1/1 [==============================] - 0s 13ms/step\n",
      "epoch: 16400.00000 | total_loss:    0.00014 | domain_loss:    0.01156 | bdc_loss:    0.00003\n",
      "1/1 [==============================] - 0s 11ms/step\n",
      "epoch: 16600.00000 | total_loss:    0.00013 | domain_loss:    0.01047 | bdc_loss:    0.00003\n",
      "1/1 [==============================] - 0s 13ms/step\n",
      "epoch: 16800.00000 | total_loss:    0.00012 | domain_loss:    0.00980 | bdc_loss:    0.00002\n",
      "1/1 [==============================] - 0s 11ms/step\n",
      "epoch: 17000.00000 | total_loss:    0.00012 | domain_loss:    0.01009 | bdc_loss:    0.00002\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 17200.00000 | total_loss:    0.00014 | domain_loss:    0.01142 | bdc_loss:    0.00002\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 17400.00000 | total_loss:    0.00012 | domain_loss:    0.00976 | bdc_loss:    0.00002\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 17600.00000 | total_loss:    0.00012 | domain_loss:    0.00956 | bdc_loss:    0.00002\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 17800.00000 | total_loss:    0.00010 | domain_loss:    0.00850 | bdc_loss:    0.00002\n",
      "1/1 [==============================] - 0s 11ms/step\n",
      "epoch: 18000.00000 | total_loss:    0.00010 | domain_loss:    0.00861 | bdc_loss:    0.00002\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 18200.00000 | total_loss:    0.00011 | domain_loss:    0.00889 | bdc_loss:    0.00002\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 18400.00000 | total_loss:    0.00009 | domain_loss:    0.00785 | bdc_loss:    0.00002\n",
      "1/1 [==============================] - 0s 13ms/step\n",
      "epoch: 18600.00000 | total_loss:    0.00009 | domain_loss:    0.00797 | bdc_loss:    0.00002\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 18800.00000 | total_loss:    0.00011 | domain_loss:    0.00997 | bdc_loss:    0.00001\n",
      "1/1 [==============================] - 0s 11ms/step\n",
      "epoch: 19000.00000 | total_loss:    0.00010 | domain_loss:    0.00849 | bdc_loss:    0.00001\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 19200.00000 | total_loss:    0.00010 | domain_loss:    0.00908 | bdc_loss:    0.00001\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 19400.00000 | total_loss:    0.00008 | domain_loss:    0.00683 | bdc_loss:    0.00001\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 19600.00000 | total_loss:    0.00008 | domain_loss:    0.00688 | bdc_loss:    0.00001\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "epoch: 19800.00000 | total_loss:    0.00009 | domain_loss:    0.00771 | bdc_loss:    0.00001\n",
      "1/1 [==============================] - 0s 12ms/step\n",
      "Training time cost:  134.12255 seconds\n"
     ]
    }
   ],
   "source": [
    "epoch_number_list = []\n",
    "total_loss_list = []\n",
    "domain_loss_list = []\n",
    "boundary_loss_list = []\n",
    "uxy_list = []\n",
    "dudx_list = []\n",
    "dudy_list = []\n",
    "d2udx2_list = []\n",
    "d2udy2_list = []\n",
    "d2udxdy_list = []\n",
    "laplace_list = []\n",
    "pde_model_train.load_weights('picn_initial_weights.h5')\n",
    "pde_model_train.compile(optimizer=keras.optimizers.Adam(learning_rate=0.0001), loss=\"mse\", loss_weights = [0.01, 0.99])\n",
    "\n",
    "# Record the training time cost\n",
    "start = time.time()\n",
    "\n",
    "# Training\n",
    "pde_model_train.fit(x=training_input_data, \n",
    "                    y=training_label_data, \n",
    "                    epochs=20000, verbose=0,\n",
    "                    callbacks=callbacks)\n",
    "\n",
    "# Record the training time cost\n",
    "end = time.time()\n",
    "print(\"Training time cost: {:10.5f} seconds\".format(end - start))\n",
    "time_costs_text_file = open(\"time_costs.txt\", \"w\")\n",
    "time_costs_text_file.write(\"Training time cost: {:10.5f} seconds\".format(end - start))\n",
    "time_costs_text_file.close()\n",
    "\n",
    "# Load the best weights\n",
    "pde_model_train.load_weights('picn_best_weights.h5')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 9. LOSS"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA+EAAAFfCAYAAAAh5s3KAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAClL0lEQVR4nOzdd3xUVf7/8df0Sa+EmtBLQAhICU0FQUFXFsSuq+iuHVldXBW2WPanX921sUosq7tiFywodmyICtJBpIN0SCW9TL2/P8ZMGBIgQEhI8n4+HveRzLn3zpzRAHnPOedzTIZhGIiIiIiIiIjISWdu6A6IiIiIiIiINBcK4SIiIiIiIiL1RCFcREREREREpJ4ohIuIiIiIiIjUE4VwERERERERkXqiEC4iIiIiIiJSTxTCRUREREREROqJtaE7UNf8fj/79u0jKioKk8nU0N0RERERERGRJs4wDIqLi2nTpg1m85HHuptcCN+3bx/JyckN3Q0RERERERFpZnbv3k27du2OeE2TCeEZGRlkZGTg9XqBwJuPjo5u4F6JiIiIiIhIU1dUVERycjJRUVFHvbbJhPBKlVPQo6OjFcJFRERERESk3tRmSbTJMAyjHvpSb4qKioiJiaGwsFAhXERERERERE66Y8mhTaY6ekZGBj179mTgwIEN3RURERERERGRGmkkXEREREREROQEHEsObTJrwisLs/l8vobuioiIiIiINCCfz4fH42nobkgTYrPZsFgsdfJcGgkXEREREZEmwTAMMjMzKSgoaOiuSBMUGxtLq1ataiy+1ixHwkVEREREpHmrDOBJSUmEh4fXqlK1yNEYhkFZWRnZ2dkAtG7d+oSer8mEcE1HFxERERFpvnw+XzCAJyQkNHR3pIkJCwsDIDs7m6SkpBOamt5kqqNPnjyZ9evXs2zZsobuioiIiIiI1LPKNeDh4eEN3BNpqip/tk603kCTCeEiIiIiIiKagi4nS139bDWZEK59wkVERERERORU12RCeGOcjl7uKecf3/4Dl9fV0F0RERERERGRetBkQnhj4/F5uOTtS7hvwX389q3fUuoubeguiYiIiIhIE3fttdcyYcKEWl07YsQI7rjjjpPan+ZIIbyB/Jz9M19v/xqA+dvmc+5r51JQUdCwnRIRERERkXp3PGFXAbnxajIhvLGtCe/Xuh/zr55PjCMGgEW7FzFi1giySrIauGciIiIiIo2bYRiUefwNehiG0dD/GeQUZTKa2E9HUVERMTExFBYWEh0d3dDdOarVmas599VzySnLAaBrfFe+uPoL2se2b+CeiYiIiIg0HhUVFWzfvp2OHTvit9h56ucDDdqfP54WT7jt6GOe1157LS+//HJI2/bt29m5cyd33XUXa9asIT4+nkmTJvHggw9itVoPe09ycjI33ngjX3/9NZmZmaSkpHDrrbdy++23h7xeQUEB77///lH7NmLECPr27cuMGTMAyM/P5/bbb+fDDz/E5XJx1lln8dRTT9G1a1cAdu7cyW233cb333+P2+2mQ4cOPProo5x//vnk5+dz2223MX/+fEpKSmjXrh1/+ctfuO66647aj1PFwT9jTqcz5Nyx5NAmMxLeWPVt1ZfvrvuO5OhkALYc2MLwl4azMXdjA/dMRERERKT5Cs/LrpfX+fe//82QIUO44YYb2L9/P/v378dms3H++eczcOBA1qxZw7PPPst///tfHnzwwcPek5ycjN/vp127drz99tusX7+ee++9l7/85S/MmTOnTvp67bXXsnz5cubNm8fixYsxDIPzzz8/uG/25MmTcblcLFy4kLVr1/LPf/6TyMhIAP7+97+zfv16Pv30UzZs2MCzzz5LYmJinfSrsbE2dAcEuid25/vff885r57D5rzN7CnawxkvncHnv/uc01uf3tDdExERERFpVsLzsplyTi+e/mIdZQlJJ/W1YmJisNvthIeH06pVKwD++te/kpyczMyZMzGZTPTo0YN9+/Zxzz33cO+999Z4D4DFYuGBBx4IPu7YsSOLFy9mzpw5XHrppSfUzy1btjBv3jx++OEHhg4dCsDrr79OcnIy77//Ppdccgm7du3ioosuonfv3gB06tQpeP+uXbvo168fAwYMAKBDhw4n1J/GTCPhp4iUmBS+u+47+rbqC0BuWS6PfP9Iw3ZKRERERKQZKktIqpcAfjgbNmxgyJAhmEymYNuwYcMoKSlhz549R7w3IyOD/v3706JFCyIjI/nPf/7Drl276qRPVquV9PT0YFtCQgLdu3dnw4YNAPzxj3/kwQcfZNiwYdx333389NNPwWtvueUW3nrrLfr27cvdd9/NokWLTrhPjZVGwk8hSRFJfDPpGy544wIAXhr/Usj57jO7U+ouJdoRTZQjKvDVHkWEPYII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MzPp27cvn332WbVibSINJdoRzd3D7mbKoCnMWj2Lfy36FwfKD3DrwFtDriv3lOOwOjCbTrnSCiIiIiLyqycWP8ETi5846nWntz6deVfMC2n77Zu/rdXSxKlDpjJ1yNTj7uPUqVP54YcfmDdvHi1btuTee+9l5cqV9O3bFwgE5C1btjBv3jyio6O55557OP/881m/fj3R0dFccMEFvPHGG5x33nnB53z99deZMGEC4eHheDwexowZw5AhQ/juu++wWq08+OCDjB07lp9++gm7PVC4+KuvviI6OpovvvgipH9//etfeeyxx+jatSt//etfueKKK9i6dStWa81xctu2bbz//vt89NFH5Ofnc+mll/LII4/w0EMP1er9Hgu/3x8M4N9++y1er5fJkydz2WWXsWDBAgCuuuoq+vXrx7PPPovFYmH16tXYbDYgMJjrdrtZuHAhERERrF+/nsjIyGPux7Go8xA+YsQIDMM44jW33XYbt912W52+rqqjS10Ls4Vxy8BbuKH/Dfyc/XO1bc3u/eZePtv2GfeddR8TUycqjIuIiIicgopcRewt3nvU65Jjkqu15ZTl1OreIlfRcfUNAqPCL7/8Mm+88QajRo0C4KWXXqJNm0Ax4crw/cMPPzB06FAgELCTk5N5//33ueSSS7jqqqu4+uqrKSsrIzw8nKKiIj7++GPmzp0LwOzZs/H7/bz44ouYTKbga8TGxrJgwQLOPfdcACIiInjxxReDobxypPzPf/4zv/nNbwB44IEH6NWrF1u3bqVHjx41vie/38+sWbOIiooC4Oqrr+arr77ioYceOur7PVZfffUVa9euZfv27SQnB/4fvvLKK/Tq1Ytly5YxcOBAdu3axV133RXsb9euXYP379q1i4suuii4I1enTp2Oqx/Hol63KDuZJk+ezOTJkykqKiImJuboN4jUktVspW+rviFtWSVZZCzLoNxbziVvX0Kfln2476z7mNBjgsK4iIiIyCkk2hFN26i2R72uRXj1LWpbhLeo1b3Rjujj6hvAL7/8gsfjYdCgQcG2mJgYunfvDsCGDRuwWq2kp6cHzyckJNC9e3c2bNgAwPnnn4/NZmPevHlcfvnlvPvuu0RHRzN69GggMB1769atwVBcqaKigm3btgUf9+7dOxjAD9anT5/g961btwYgOzv7sCG8Q4cOIa/VunVrsrOza/V+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/vvvp2/fviHPN2PGDDp06BB8fO211zJhwgQee+wxWrduTUJCApMnT8bjqZpJmZ2dzbhx4wgLC6Njx468/vrr1fr5xBNP0Lt3byIiIkhOTubWW2+lpKQkeL5y6vi8efPo2bMnDoeD77//HpvNRmZmZshz3XHHHZxxxhnH9d/r2WefpXPnztjtdrp3786rr74aPGcYBvfffz8pKSk4HA7atGnDH//4x+D5Z555hq5du+J0OmnZsiUXX3zxcfXhRJxyIXz37t2MGDGCnj170qdPH95+++2G7pLIKalPyz68f/n7rLxxJVecdkXIuXXZ6+jzXB/eWf8OfkOfPoqIiEjz9cQT0K7d0Y/f/rb6vb/9be3ufeIEJyW+/PLLWK1Wli5dyr///W+eeOIJXnzxRSAQoJcvX868efNYvHgxhmFw/vnnhwTo2vjmm2/Ytm0b33zzDS+//DKzZs1i1qxZwfPXXnstu3fv5ptvvuGdd97hmWeeITs7O+Q5zGYzTz31FOvWrePll1/m66+/5u677w65pqysjH/+85+8+OKLrFu3jgEDBtCpU6eQoOzxeHj99df5/e9Dt+atjblz53L77bdz55138vPPP3PTTTdx3XXX8c033wDw7rvv8uSTT/L888+zZcsW3n//fXr37g3A8uXL+eMf/8g//vEPNm3axGeffcaZZ555zH04YcYpZt++fcaqVasMwzCM/fv3G23atDFKSkpqfX9hYaEBGIWFhSephyKnvotmX2RwPwb3Y/R9rq/xwcYPDL/f39DdEhERETlpysvLjfXr1xvl5eUh7ffdZxhw9GPw4OrPOXhw7e69777j7/dZZ51lpKamhvyuds899xipqanG5s2bDcD44Ycfgudyc3ONsLAwY86cOb++v/uMtLS0kOd88sknjfbt2wcfT5o0yWjfvr3h9XqDbZdccolx2WWXGYZhGJs2bTIAY+nSpcHzGzZsMADjySefPGzf3377bSMhISH4+KWXXjIAY/Xq1SHX/fOf/zRSU1ODj999910jMjKyVjnvpZdeMmJiYoKPhw4datxwww0h11xyySXG+eefbxiGYTz++ONGt27dDLfbXe253n33XSM6OtooKio66uvW5HA/Y4ZxbDn0lBsJb926dXA6RatWrUhMTOTAgQMN2ymRRsTldZFVmhV8vDpzNePfGs+gFwfx6ZZPNU1dRERE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",
      "text/plain": [
       "<Figure size 1200x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "df=pd.DataFrame({'epoch': epoch_number_list, \n",
    "                 'total_loss': total_loss_list, \n",
    "                 'governing_loss': domain_loss_list, \n",
    "                 'boundary_loss': boundary_loss_list})\n",
    "\n",
    "plt.figure(figsize=(12, 4))\n",
    "plt.plot( 'epoch', 'total_loss', data=df, marker='o', markerfacecolor='red', markersize=2, color='skyblue', linewidth=3)\n",
    "plt.plot( 'epoch', 'governing_loss', data=df, marker='', color='green', linewidth=2, linestyle='dashed')\n",
    "plt.plot( 'epoch', 'boundary_loss', data=df, marker='', color='blue', linewidth=2, linestyle='dashed')\n",
    "plt.legend()\n",
    "#plt.xscale('log')\n",
    "plt.yscale('log')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1/1 [==============================] - 0s 14ms/step\n"
     ]
    }
   ],
   "source": [
    "[x_m, y_m, uxy, dudx, dudy, d2udx2, d2udy2, d2udxdy, laplace] = pde_model.predict(training_input_data[:3])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 10. Results overview"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, 'error')"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABJEAAAE8CAYAAABw9CAlAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAACH2ElEQVR4nO3de3xMZ/4H8M8kckMStxAhRKLrLrIuKe0qK5XQpbZWtT8VskqrSV1ibaUtobZC3atKWbdqLVWltq1YjVu77tEoStStSUNciiSCJDLz+yN7xsxkLmdmzpk5M/N5v17zYs4858xzSL4zz/e5qTQajQZERERERERERERmeDm7AkREREREREREpHxMIhERERERERERkUVMIhERERERERERkUVMIhERERERERERkUVMIhERERERERERkUVMIhERERERERERkUVMIhERERERERERkUVMIhERERERERERkUVMIhERERERERERkUVMIpHb2Lt3L1QqFfbu3as9NnLkSEREREj2HmvXroVKpcLly5cluyYRETnf5cuXoVKpMG/ePGdXhYiIiEixmEQiMmLWrFnYtm2bs6tBROSRDhw4gOnTp+POnTuSX/ubb77B9OnTJb8uERERkSdgEonc2sqVK5Gbm2v1eaaSSMOHD8f9+/fRvHlzCWpHRETGHDhwADNmzJAtiTRjxgzJr0tERETkCZhEIqdTq9V48OCBLNf28fGBn5+fZNfz9vaGv78/VCqVZNckIiLbyPn5QUREruPBgwdQq9VGXystLbXr2vysIdLHJBJJZvr06VCpVDh79iyef/55BAUFoX79+hg/frxe4FWpVEhJScGnn36Kdu3awc/PD5mZmQCAgoIC/PWvf0WjRo3g5+eHdu3aYfXq1dXe69dff8WgQYNQq1YtNGzYEBMnTkRZWVm1csbWRFKr1Vi8eDE6dOgAf39/hISEICEhAceOHdPWr7S0FOvWrYNKpYJKpcLIkSMBmF4T6cMPP9TeS1hYGJKTk6v1oPfq1Qvt27fHTz/9hN69e6NmzZpo0qQJ3nvvPSv/pYmI3Nf06dMxefJkAECLFi20cVhYs8jY54exNfGAR+scrV27FkDVZ8LSpUsBQHtdY50CK1asQFRUFPz8/NC1a1ccPXpU1nsmIqJHLLUHhJi/ceNGvP3222jSpAlq1qyJ4uJijBw5ErVr18aF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",
      "text/plain": [
       "<Figure size 1400x300 with 6 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "z_mesh = U(x_mesh,y_mesh)\n",
    "z_mesh[~governing_equation_mask] = np.nan\n",
    "\n",
    "fig, axs = plt.subplots(1,3,constrained_layout=False, figsize=(14, 3))\n",
    "#\n",
    "ax = axs.ravel()[0]\n",
    "temp = uxy[0,:,:,0]\n",
    "temp[~governing_equation_mask]=np.nan\n",
    "cs = ax.contourf(x_domain, y_domain, uxy[0,:,:,0],np.linspace(-2, 6, 20))\n",
    "fig.colorbar(cs, ax=ax, shrink=0.9)\n",
    "ax.set_xlabel('x')\n",
    "ax.set_ylabel('y')\n",
    "ax.set_title('prediction')\n",
    "#\n",
    "ax = axs.ravel()[1]\n",
    "cs = ax.contourf(x_domain, y_domain, z_mesh,np.linspace(-2, 6, 20))\n",
    "fig.colorbar(cs, ax=ax, shrink=0.9)\n",
    "ax.set_xlabel('x')\n",
    "ax.set_ylabel('y')\n",
    "ax.set_title('truth')\n",
    "#\n",
    "ax = axs.ravel()[2]\n",
    "cs = ax.contourf(x_domain, y_domain, uxy[0,:,:,0]-z_mesh)\n",
    "fig.colorbar(cs, ax=ax, shrink=0.9)\n",
    "ax.set_xlabel('x')\n",
    "ax.set_ylabel('y')\n",
    "ax.set_title('error')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 11. Save the Process Data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [],
   "source": [
    "picn_process_data = {'x_domain':x_domain,\n",
    "                     'y_domain':y_domain,\n",
    "                     'epoch_number_list':np.asarray(epoch_number_list),\n",
    "                     'total_loss_list':np.asarray(total_loss_list),\n",
    "                     'domain_loss_list':np.asarray(domain_loss_list),\n",
    "                     'boundary_loss_list':np.asarray(boundary_loss_list),\n",
    "                     'uxy_list':np.concatenate(uxy_list,axis=0),\n",
    "                     'dudx_list':np.concatenate(dudx_list,axis=0),\n",
    "                     'dudy_list':np.concatenate(dudy_list,axis=0),\n",
    "                     'd2udx2_list':np.concatenate(d2udx2_list,axis=0),\n",
    "                     'd2udy2_list':np.concatenate(d2udy2_list,axis=0),\n",
    "                     'd2udxdy_list':np.concatenate(d2udxdy_list,axis=0),\n",
    "                     'laplace_list':np.concatenate(laplace_list,axis=0)}\n",
    "savemat('picn_process_data.mat', picn_process_data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
